
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>什么是布隆过滤器？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>什么是布隆过滤器？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是布隆过滤器（Bloom Filter）？它的主要用途是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">布隆过滤器是一种空间效率高且查询速度快的概率型数据结构，它由一个位数组和多个独立的哈希函数组成，专门用于高效地判断一个元素是否在一个集合中。</div>
          </div>
          <div class="card-source">来源: 布隆过滤器是做什么的</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">当查询一个元素时，布隆过滤器是如何判断该元素“一定不存在”的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">查询时，使用所有哈希函数对该元素进行哈希计算，得到多个位置索引。然后检查位数组中这些位置的值，如果其中任何一个位置的位是0，则可以确定该元素一定不在集合中。</div>
          </div>
          <div class="card-source">来源: 4. 元素查询（Query）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">布隆过滤器的查询结果存在哪种类型的错误，又绝对不会出现哪种类型的错误？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">布隆过滤器可能会误判某个元素存在于集合中（即“假阳性”），但它绝不会误判一个存在的元素为不存在（即不会有“假阴性”）。</div>
          </div>
          <div class="card-source">来源: 主要特点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">结构</div>
          <div class="card-question">构成布隆过滤器的两个核心数据结构是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">结构</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">布隆过滤器的核心结构由两部分组成：一个固定长度的位数组（Bit Array）和一个或多个独立的哈希函数（Hash Functions）。</div>
          </div>
          <div class="card-source">来源: 布隆过滤器的结构</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">向布隆过滤器中添加一个新元素时，其内部会发生什么变化？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当添加一个元素时，布隆过滤器会使用所有的哈希函数对该元素进行计算，得到多个哈希值。然后，它会将位数组中与这些哈希值相对应的位置都置为1。</div>
          </div>
          <div class="card-source">来源: 3. 元素添加（Insertion）</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">限制</div>
          <div class="card-question">为什么标准的布隆过滤器不支持删除元素的操作？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">限制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为删除一个元素需要将位数组中对应的位置为0，但这可能会影响到其他也映射到相同位置的元素的存在判断，导致系统错误。</div>
          </div>
          <div class="card-source">来源: 布隆过滤器的优缺点 -> 缺点</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">应用</div>
          <div class="card-question">在缓存系统中，布隆过滤器是如何帮助防止“缓存击穿”问题的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">应用</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">通过布隆过滤器可以提前判断某个元素是否可能存在于缓存中。如果布隆过滤器判断数据不存在，就可以直接返回未命中，避免了请求频繁击中后端数据库，从而减少了对后端存储系统的压力。</div>
          </div>
          <div class="card-source">来源: 解决的问题 -> 缓存击穿问题</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">性能</div>
          <div class="card-question">布隆过滤器的插入和查询操作的时间复杂度是多少？它与什么因素有关？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">性能</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">布隆过滤器的插入和查询时间复杂度均为O(k)，其中k是所使用的哈希函数的个数。由于k通常是一个很小的常数，因此查询非常快速。</div>
          </div>
          <div class="card-source">来源: 6. 空间和时间复杂度</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">优点</div>
          <div class="card-question">相比于哈希表等传统数据结构，布隆过滤器的主要优点是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">优点</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">布隆过滤器的主要优点是空间效率高，可以在较小的空间内存储大量元素信息；并且查询速度快，时间复杂度为O(k)，k为哈希函数数量。</div>
          </div>
          <div class="card-source">来源: 布隆过滤器的优缺点 -> 优点</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
